home *** CD-ROM | disk | FTP | other *** search
- <?xml version="1.0"?>
-
- <bindings id="feedreaderBindings"
- xmlns="http://www.mozilla.org/xbl"
- xmlns:html="http://www.w3.org/1999/xhtml"
- xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
- xmlns:xbl="http://www.mozilla.org/xbl">
-
- <binding id="feedreader" extends="xul:box">
- <content>
- <xul:toolbaritem id="feedreader" flex="1">
- <xul:image id="feedreader-left-cap"/>
- <xul:button tooltiptext="Toggle News Sidebar" id="feedreader-sidebar-toggle" oncommand="toggleFeedSidebar()"/>
- <xul:button tooltiptext="Reload Feed" id="feedreader-reload" xbl:inherits="hidden=hidereloadbutton" oncommand="readFeed()"/>
- <xul:button tooltiptext="Previous Item" id="feedreader-previous" oncommand="previousFeedItem()"/>
- <xul:button tooltiptext="Next Item" id="feedreader-next" oncommand="nextFeedItem()"/>
- <xul:hbox id="feedreader-textbox" disabled="true" xbl:inherits="width" flex="1">
- <xul:toolbarbutton label="Loading..." crop="end" pack="start" anonid="feedreader-item" flex="1" type="menu-button">
- <xul:menupopup position="after_end" id="feedreader-select-popup" anonid="feedreader-select-popup">
- </xul:menupopup>
- </xul:toolbarbutton>
- </xul:hbox>
- <xul:image id="feedreader-right-cap" />
- </xul:toolbaritem>
- <children includes="btfeed" />
- </content>
- <handlers>
- <handler event="command">
- <![CDATA[
- if (event.originalTarget.hasAttribute("bt-url")) {
- var subject = {};
- subject.wrappedJSObject = this.brandObject;
- this.observerService.notifyObservers(subject, "brandthunder", this.id);
- this.brandObject.utilities.openLink(this.brandObject, event, event.originalTarget.getAttribute("bt-url"));
- } else if (event.originalTarget.hasAttribute("bt-feed")) {
- this.currentfeed = event.originalTarget.getAttribute("bt-feed");
- this.readFeed(event.originalTarget.getAttribute("bt-feed"));
- var currentBoom = this.btPrefBranch.getCharPref("currentBoom");
- this.btPrefBranch.setCharPref(currentBoom + ".currentfeed", this.currentfeed);
- }
- ]]>
- </handler>
- <handler event="popupshowing">
- <![CDATA[
- if (event.originalTarget.getAttribute("anonid") == "feedreader-select-popup") {
- for (let i= event.originalTarget.childNodes.length - 1; i >= 0; i--) {
- if (event.originalTarget.childNodes.item(i).getAttribute("bt-feed") == this.currentfeed) {
- event.originalTarget.childNodes.item(i).setAttribute("checked", "true");
- } else {
- event.originalTarget.childNodes.item(i).removeAttribute("checked");
- }
- }
- }
- ]]>
- </handler>
- </handlers>
- <implementation>
- <constructor>
- <![CDATA[
- if (this.childNodes.length) {
- this.currentfeed = this.childNodes[0].getAttribute('src');
- } else if (this.hasAttribute("feed")) {
- this.currentfeed = this.getAttribute("feed");;
- } else {
- return;
- }
- if (this.childNodes.length > 1) {
- var menupopup = document.getAnonymousElementByAttribute(this, "anonid", "feedreader-select-popup");
- for (var i=0; i < this.childNodes.length; i++) {
- if (this.childNodes[i].hasAttribute("src") && this.childNodes[i].hasAttribute("title")) {
- var menuitem = document.createElement("menuitem");
- menuitem.setAttribute("label", childNodes[i].getAttribute("title"));
- menuitem.setAttribute("bt-feed", childNodes[i].getAttribute("src"));
- menuitem.setAttribute("type", "checkbox");
- menupopup.appendChild(menuitem);
- }
- }
- } else {
- var feedReaderItemButton = document.getAnonymousElementByAttribute(this, "anonid", "feedreader-item");
- feedReaderItemButton.removeAttribute("type");
- }
-
-
- this.observerService = Components.classes["@mozilla.org/observer-service;1"]
- .getService(Components.interfaces.nsIObserverService)
-
- if (this.hasAttribute('brand')) {
- this.brandObject = BrandThunder.clients[this.getAttribute('brand')];
- }
- this.btPrefBranch = Components.classes["@mozilla.org/preferences-service;1"]
- .getService(Components.interfaces.nsIPrefService)
- .getBranch("extensions.brandthunder.");
- try {
- var currentBoom = this.btPrefBranch.getCharPref("currentBoom");
- this.currentfeed = this.btPrefBranch.getCharPref(currentBoom + ".currentfeed" );
- } catch(ex) {}
-
-
- if (this.hasAttribute('numitems')) {
- this.numitems = this.getAttribute('numitems');
- }
- if (this.hasAttribute('rotationdelay')) {
- this.rotationdelay = this.getAttribute('rotationdelay') * 1000;
- }
- if (this.hasAttribute('sidebar')) {
- this.sidebarID = this.getAttribute('sidebar');
- document.getAnonymousElementByAttribute(this, 'id', 'feedreader-sidebar-toggle').setAttribute('observes', this.sidebarID);
- } else {
- document.getAnonymousElementByAttribute(this, 'id', 'feedreader-sidebar-toggle').setAttribute('hidden', true);
- }
-
- this.readFeed();
- function reloadFeed(feedreader) {
- return function() {
- feedreader.readFeed(feedreader.currentfeed, feedreader);
- }
- }
- this.reloadTimer = window.setInterval(reloadFeed(this), this.reloaddelay);
- ]]>
- </constructor>
- <destructor>
- window.clearInterval(this.rotationTimer);
- window.clearInterval(this.reloadTimer);
- </destructor>
- <field name="currentfeed"/>
- <field name="feedItems">
- [];
- </field>
- <field name="numitems">
- -1;
- </field>
- <field name="feedIndex">
- 0;
- </field>
- <field name="selectedIndex">
- 0;
- </field>
- <field name="rotationdelay">
- 5000;
- </field>
- <field name="reloaddelay">
- 1800000;
- </field>
- <field name="itemtitleprefix">
- "";
- </field>
- <field name="itemurlprefix">
- "";
- </field>
- <field name="currentFeedItem">
- 0
- </field>
- <field name="rssdeckElement">
- document.getAnonymousElementByAttribute(this, 'id', 'feedreader-deck');
- </field>
- <field name="rotationTimer">
- </field>
- <field name="reloadTimer">
- </field>
- <field name="readSrcTimer">
- </field>
- <field name="sidebarID">
- ""
- </field>
- <field name="brandObject"/>
- <field name="btClientBranch"/>
- <field name="observerService"/>
-
-
- <method name="toggleFeedSidebar">
- <body>
- <![CDATA[
- if (this.sidebarID) {
- toggleSidebar(this.sidebarID);
- }
- ]]>
- </body>
- </method>
-
- <method name="startFeedRotation">
- <body>
- <![CDATA[
- function advance(feedreader) {
- return function() {
- feedreader.nextFeedItem();
- }
- }
- this.rotationTimer = window.setInterval(advance(this), this.rotationdelay);
- ]]>
- </body>
- </method>
-
- <method name="updateFeedItem">
- <body>
- <![CDATA[
- if (this.feedItems == 0) {
- return;
- }
- var feedReaderItemButton = document.getAnonymousElementByAttribute(this, "anonid", "feedreader-item");
- feedReaderItemButton.setAttribute("label", this.feedItems[this.currentFeedItem].title);
- feedReaderItemButton.setAttribute("tooltiptext", this.feedItems[this.currentFeedItem].title);
- if (this.childNodes.length > 1) {
- document.getAnonymousElementByAttribute(feedReaderItemButton, "anonid", "button").setAttribute('bt-url', this.feedItems[this.currentFeedItem].url);
- } else {
- feedReaderItemButton.setAttribute('bt-url', this.feedItems[this.currentFeedItem].url);
- }
- ]]>
- </body>
- </method>
-
-
- <method name="previousFeedItem">
- <body>
- <![CDATA[
- var numItems;
- if (this.numitems > -1) {
- numItems = this.numitems;
- } else {
- numItems = this.feedItems.length;
- }
- this.currentFeedItem--;
- if (this.currentFeedItem < 0) {
- this.currentFeedItem = numItems-1;
- }
- this.updateFeedItem();
- ]]>
- </body>
- </method>
-
-
-
- <method name="nextFeedItem">
- <body>
- <![CDATA[
- var numItems;
- if (this.numitems > -1) {
- numItems = this.numitems;
- } else {
- numItems = this.feedItems.length;
- }
- this.currentFeedItem++;
- if (this.currentFeedItem >= numItems) {
- this.currentFeedItem = 0;
- }
- this.updateFeedItem();
- ]]>
- </body>
- </method>
- <method name="readFeed">
- <parameter name="feed" />
- <parameter name="feedreader" />
- <body>
- if (!feedreader) {
- feedreader = this;
- }
- <![CDATA[
- if (!feed) {
- feed = feedreader.currentfeed;
- }
- feedreader.feedItems = [];
-
- var xhr = new XMLHttpRequest();
- xhr.open('GET', feed, true);
- xhr.onload = function() {
- feedreader.parseFeed(xhr.responseText);
- }
- xhr.send(null);
- ]]>
- </body>
- </method>
- <method name="parseFeed">
- <parameter name="xml" />
- <body>
- <![CDATA[
- var parser = new DOMParser();
- var dom = parser.parseFromString(xml, 'text/xml');
-
- // check for error
- if (dom.documentElement.nodeName == 'parsererror')
- throw new Error('Could not parse feed');
-
- var xmlDoc = dom.documentElement;
- switch (xmlDoc.nodeName.toLowerCase()) {
- case 'feed': this.parseAtom(xmlDoc); break;
- case 'rdf:rdf': this.parseRss(xmlDoc); break;
- case 'rss': this.parseRss(xmlDoc); break;
- }
- if (this.feedItems.length > 0) {
- this.currentFeedItem = 0;
- this.updateFeedItem();
- // this.startFeedRotation();
- } else {
- var feedReaderItemButton = document.getAnonymousElementByAttribute(this, "anonid", "feedreader-item");
- feedReaderItemButton.setAttribute("label", "No Feed Items");
- }
-
- ]]>
- </body>
- </method>
- <method name="parseAtom">
- <parameter name="xmlDoc" />
- <body>
- <![CDATA[
- var entries = xmlDoc.getElementsByTagName('entry');
- for (var i = 0; i < entries.length; i++) {
- this.feedItems[i] = ['title', 'url'];
-
- //load the entry title
- this.feedItems[i]['title'] = entries[i].getElementsByTagName('title')[0].firstChild.nodeValue;
-
- //if <id> is an absolute URL, use that
- var elem = entries[i].getElementsByTagName('id');
- for (var j = 0; j < elem.length; j++) {
- var kids = elem[j].childNodes;
- if (kids.length > 0) {
- var val = kids[0].nodeValue;
- if (val != null && val.match(/^http:\/\//)) {
- this.feedItems[i]['url'] = val;
- break;
- }
- }
- }
-
-
- //instead look for a <link> tag
- if (this.feedItems[i]['url'] == null) {
- var elem = entries[i].getElementsByTagName('link');
- for (var j = 0; j < elem.length; j++) {
- var rel = elem[j].getAttribute('rel');
- if (rel == null || rel == 'alternate') {
- this.feedItems[i]['url'] = elem[j].getAttribute('href');
- break;
- }
- }
- }
-
- if (this.feedItems[i]['title'] == null || this.feedItems[i]['url'] == null)
- throw new Error('Invalid feed');
- }
-
- ]]>
- </body>
- </method>
- <method name="parseRss">
- <parameter name="xmlDoc" />
- <body>
- <![CDATA[
- var items = xmlDoc.getElementsByTagName('item');
- for (var i = 0; i < items.length; i++) {
- this.feedItems[i] = ['title', 'url'];
-
- var titleElem = items[i].getElementsByTagName('title');
- if (titleElem.length > 0)
- this.feedItems[i]['title'] = titleElem[0].textContent;
-
- var linkElem = items[i].getElementsByTagName('link');
- if (linkElem.length > 0)
- this.feedItems[i]['url'] = linkElem[0].textContent;
-
- if (this.feedItems[i]['title'] == null || this.feedItems[i]['url'] == null)
- throw new Error('Invalid feed');
- }
- ]]>
- </body>
- </method>
- </implementation>
- </binding>
-
- <binding id="feed"></binding>
- </bindings>
-